#ifndef OBSERVERPATTERN_H
#define OBSERVERPATTERN_H


#include <QObject>
#include <QTimer>
#include <QMutex>
#include "serialportcore.h"

//串口数据状态
  struct SensorState {
      QByteArray rawData;
      bool is_valid = false;
      qint64 timestamp = 0;

  };

  // 观察者接口
  class Observer {
  public:
      virtual void update(const SensorState &state) = 0; // 数据更新回调
      virtual ~Observer() = default;
  };


  // 主题接口
  class Subject {
  public:
      virtual void registerObserver(Observer *observer) = 0; // 注册观察者
      virtual void removeObserver(Observer *observer) = 0;   // 移除观察者
      virtual void notifyObservers() = 0;                    // 通知观察者
      virtual ~Subject() = default;
  };
  // 具体主题类,关联串口核心与观察者
  class SerialPortSubject :public QObject, public Subject {
      Q_OBJECT
  public:
      explicit SerialPortSubject(SerialPortCore *serialCore);
      ~SerialPortSubject() override;

      // 主题接口实现
      void registerObserver(Observer *observer) override;
      void removeObserver(Observer *observer) override;
      void notifyObservers() override;

      // 串口操作代理,转发到核心层
      bool openPort(const QString &portName, qint32 baudRate = 9600);
      void closePort();
      qint64 sendData(const QByteArray &data);
      QStringList getAvailablePorts() const;
      bool isPortOpen() const;

      // 获取当前状态
      SensorState getCurrentState() const;

  private:
      SerialPortCore *m_serialCore;       // 依赖核心层串口功能
      QList<Observer *> m_observers;      // 观察者列表
      SensorState m_currentState ; // 当前业务状态
      QMutex m_mutex;  // 线程安全锁

  private slots:
      // 处理核心层的串口数据
      void onDataReceived(const QByteArray &data);//TODO 未完成处理串口数据
  };

  // 具体观察者类，处理订阅逻辑
  class SerialPortObserver : public QObject, public Observer {
      Q_OBJECT
  public:
      explicit SerialPortObserver(SerialPortSubject *subject,
                                  int timeoutMs = 3000,
                                  QObject *parent = nullptr);
      ~SerialPortObserver() override;


      // 观察者接口实现
      void update(const SensorState &state) override;

      // 订阅控制
      //TODO 可变化 设置订阅次数
      void setSubscribeCount(int count);    // 设置订阅次数
      //TODO 可变化 超时时间
      void setTimeout(int timeoutMs);  // 设置超时时间
      //TODO 取消订阅操作
      void cancelSubscribe();               // 取消订阅
      void sendDataAndSubscribeOnce(const QByteArray &data); // 发送数据并订阅一次响应





  signals
  :
      // 转发数据到UI层
      void dataUpdated(const QString &data);
      // 订阅状态变化
      void subscribeStatusChanged(int remainingCount);
      // 超时通知
      void timeoutOccurred();

  private slots:
      // 超时处理
      void onTimeout();

  private:
      SerialPortSubject *m_subject;    // 关联的主题
      int m_remainingCount = 0;   // 剩余订阅次数

      int m_timeoutMs;  // 超时时间（毫秒）
      QTimer m_timeoutTimer ;  // 超时定时器
      QMutex m_mutex; // 线程安全锁
  };



#endif // OBSERVERPATTERN_H
